home *** CD-ROM | disk | FTP | other *** search
- Program Euxinus_3DTUTER1;
-
- uses crt,graph;
-
- type
- SCRCORD = RECORD { point on screen }
- X : INTEGER;
- Y : INTEGER;
- END;
- POINT = RECORD { Point in 3d space }
- X : INTEGER;
- Y : INTEGER;
- Z : INTEGER;
- END;
- _3DOBJECT = RECORD
- degreinc : POINT;
- degre : POINT;
- numberofpoints : INTEGER;
- color : BYTE;
- shadedcolor : Array [1..1500] of BYTE;
- orginalcordinates : Array [1..1500] of POINT;
- rotatedcordinates : Array [1..1500] of POINT;
- screencordinates : Array [1..1500] of SCRCORD;
- objpos : POINT;
- end;
-
- var obj : _3DOBJECT;
- sina,cosa : Array [0..360] of real;
- page : BYTE;
-
- Procedure object2;
-
- BEGIN
- obj.numberofpoints:=12;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
- obj.orginalcordinates[1].x:=0;
- obj.orginalcordinates[1].y:=20;
- obj.orginalcordinates[1].z:=0;
-
- obj.orginalcordinates[2].x:=0;
- obj.orginalcordinates[2].y:=10;
- obj.orginalcordinates[2].z:=18;
-
- obj.orginalcordinates[3].x:=18;
- obj.orginalcordinates[3].y:=10;
- obj.orginalcordinates[3].z:=4;
-
- obj.orginalcordinates[4].x:=10;
- obj.orginalcordinates[4].y:=10;
- obj.orginalcordinates[4].z:=-18;
-
- obj.orginalcordinates[5].x:=-10;
- obj.orginalcordinates[5].y:=10;
- obj.orginalcordinates[5].z:=-18;
-
- obj.orginalcordinates[6].x:=-18;
- obj.orginalcordinates[6].y:=10;
- obj.orginalcordinates[6].z:=4;
-
- obj.orginalcordinates[7].x:=0;
- obj.orginalcordinates[7].y:=-10;
- obj.orginalcordinates[7].z:=18;
-
- obj.orginalcordinates[8].x:=18;
- obj.orginalcordinates[8].y:=-10;
- obj.orginalcordinates[8].z:=4;
-
- obj.orginalcordinates[9].x:=10;
- obj.orginalcordinates[9].y:=-10;
- obj.orginalcordinates[9].z:=-18;
-
- obj.orginalcordinates[10].x:=-10;
- obj.orginalcordinates[10].y:=-10;
- obj.orginalcordinates[10].z:=-18;
-
- obj.orginalcordinates[11].x:=-18;
- obj.orginalcordinates[11].y:=-10;
- obj.orginalcordinates[11].z:=4;
-
- obj.orginalcordinates[12].x:=0;
- obj.orginalcordinates[12].y:=-20;
- obj.orginalcordinates[12].z:=0;
- END;
-
-
-
-
-
- Procedure object1;
-
- BEGIN
- obj.numberofpoints:=6;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
- obj.orginalcordinates[1].x:=0;
- obj.orginalcordinates[1].y:=30;
- obj.orginalcordinates[1].z:=0;
-
- obj.orginalcordinates[2].x:=-15;
- obj.orginalcordinates[2].y:=0;
- obj.orginalcordinates[2].z:=15;
-
- obj.orginalcordinates[3].x:=15;
- obj.orginalcordinates[3].y:=0;
- obj.orginalcordinates[3].z:=15;
-
- obj.orginalcordinates[4].x:=15;
- obj.orginalcordinates[4].y:=0;
- obj.orginalcordinates[4].z:=-15;
-
- obj.orginalcordinates[5].x:=-15;
- obj.orginalcordinates[5].y:=0;
- obj.orginalcordinates[5].z:=-15;
-
- obj.orginalcordinates[6].x:=0;
- obj.orginalcordinates[6].y:=-30;
- obj.orginalcordinates[6].z:=0;
- END;
-
-
-
- Procedure ship3;
-
- BEGIN
- obj.numberofpoints:=13;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
- obj.orginalcordinates[1].x:=0;
- obj.orginalcordinates[1].y:=0;
- obj.orginalcordinates[1].z:=40;
-
- obj.orginalcordinates[2].x:=-20;
- obj.orginalcordinates[2].y:=0;
- obj.orginalcordinates[2].z:=-20;
-
- obj.orginalcordinates[3].x:=-14;
- obj.orginalcordinates[3].y:=5;
- obj.orginalcordinates[3].z:=-23;
-
- obj.orginalcordinates[4].x:=-6;
- obj.orginalcordinates[4].y:=7;
- obj.orginalcordinates[4].z:=-25;
-
- obj.orginalcordinates[5].x:=0;
- obj.orginalcordinates[5].y:=9;
- obj.orginalcordinates[5].z:=-26;
-
- obj.orginalcordinates[6].x:=6;
- obj.orginalcordinates[6].y:=7;
- obj.orginalcordinates[6].z:=-25;
-
- obj.orginalcordinates[7].x:=14;
- obj.orginalcordinates[7].y:=5;
- obj.orginalcordinates[7].z:=-23;
-
- obj.orginalcordinates[8].x:=20;
- obj.orginalcordinates[8].y:=0;
- obj.orginalcordinates[8].z:=-20;
-
- obj.orginalcordinates[9].x:=14;
- obj.orginalcordinates[9].y:=-5;
- obj.orginalcordinates[9].z:=-23;
-
- obj.orginalcordinates[10].x:=6;
- obj.orginalcordinates[10].y:=-7;
- obj.orginalcordinates[10].z:=-25;
- obj.orginalcordinates[11].x:=0;
- obj.orginalcordinates[11].y:=-9;
- obj.orginalcordinates[11].z:=-26;
-
- obj.orginalcordinates[12].x:=-6;
- obj.orginalcordinates[12].y:=-7;
- obj.orginalcordinates[12].z:=-25;
-
- obj.orginalcordinates[13].x:=-14;
- obj.orginalcordinates[13].y:=-5;
- obj.orginalcordinates[13].z:=-23;
-
- end;
-
- Procedure ship2;
-
- BEGIN
- obj.numberofpoints:=5;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
-
- obj.orginalcordinates[1].x:=0;
- obj.orginalcordinates[1].y:=0;
- obj.orginalcordinates[1].z:=60;
-
- obj.orginalcordinates[2].x:=-40;
- obj.orginalcordinates[2].y:=0;
- obj.orginalcordinates[2].z:=-40;
-
- obj.orginalcordinates[3].x:=0;
- obj.orginalcordinates[3].y:=20;
- obj.orginalcordinates[3].z:=-40;
-
- obj.orginalcordinates[4].x:=40;
- obj.orginalcordinates[4].y:=0;
- obj.orginalcordinates[4].z:=-40;
-
- obj.orginalcordinates[5].x:=0;
- obj.orginalcordinates[5].y:=-20;
- obj.orginalcordinates[5].z:=-40;
- end;
-
-
-
-
- Procedure ship;
-
- BEGIN
- obj.numberofpoints:=7;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
-
- obj.orginalcordinates[1].x:=0;
- obj.orginalcordinates[1].y:=0;
- obj.orginalcordinates[1].z:=60;
-
- obj.orginalcordinates[2].x:=-40;
- obj.orginalcordinates[2].y:=0;
- obj.orginalcordinates[2].z:=-40;
-
- obj.orginalcordinates[3].x:=-20;
- obj.orginalcordinates[3].y:=10;
- obj.orginalcordinates[3].z:=-50;
-
- obj.orginalcordinates[4].x:=20;
- obj.orginalcordinates[4].y:=10;
- obj.orginalcordinates[4].z:=-50;
-
- obj.orginalcordinates[5].x:=40;
- obj.orginalcordinates[5].y:=0;
- obj.orginalcordinates[5].z:=-40;
-
- obj.orginalcordinates[6].x:=20;
- obj.orginalcordinates[6].y:=-10;
- obj.orginalcordinates[6].z:=-50;
-
- obj.orginalcordinates[7].x:=-20;
- obj.orginalcordinates[7].y:=-10;
- obj.orginalcordinates[7].z:=-50;
- end;
-
-
- Procedure object3;
-
- BEGIN
- obj.numberofpoints:=14;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
-
- obj.orginalcordinates[1].x:=0;
- obj.orginalcordinates[1].y:=30;
- obj.orginalcordinates[1].z:=0;
-
- obj.orginalcordinates[2].x:=-20;
- obj.orginalcordinates[2].y:=20;
- obj.orginalcordinates[2].z:=20;
-
- obj.orginalcordinates[3].x:=20;
- obj.orginalcordinates[3].y:=20;
- obj.orginalcordinates[3].z:=20;
-
- obj.orginalcordinates[4].x:=-30;
- obj.orginalcordinates[4].y:=0;
- obj.orginalcordinates[4].z:=0;
-
- obj.orginalcordinates[5].x:=0;
- obj.orginalcordinates[5].y:=0;
- obj.orginalcordinates[5].z:=30;
-
- obj.orginalcordinates[6].x:=30;
- obj.orginalcordinates[6].y:=0;
- obj.orginalcordinates[6].z:=0;
-
- obj.orginalcordinates[7].x:=-20;
- obj.orginalcordinates[7].y:=-20;
- obj.orginalcordinates[7].z:=20;
-
- obj.orginalcordinates[8].x:=20;
- obj.orginalcordinates[8].y:=-20;
- obj.orginalcordinates[8].z:=20;
-
- obj.orginalcordinates[9].x:=0;
- obj.orginalcordinates[9].y:=-30;
- obj.orginalcordinates[9].z:=0;
-
- obj.orginalcordinates[10].x:=-20;
- obj.orginalcordinates[10].y:=20;
- obj.orginalcordinates[10].z:=-20;
-
- obj.orginalcordinates[11].x:=20;
- obj.orginalcordinates[11].y:=20;
- obj.orginalcordinates[11].z:=-20;
-
- obj.orginalcordinates[12].x:=0;
- obj.orginalcordinates[12].y:=0;
- obj.orginalcordinates[12].z:=-30;
-
- obj.orginalcordinates[13].x:=-20;
- obj.orginalcordinates[13].y:=-20;
- obj.orginalcordinates[13].z:=-20;
-
- obj.orginalcordinates[14].x:=20;
- obj.orginalcordinates[14].y:=-20;
- obj.orginalcordinates[14].z:=-20;
- END;
-
-
-
- Procedure semitriangle;
-
- BEGIN
- obj.numberofpoints:=8;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
-
- obj.orginalcordinates[1].x:=-2;
- obj.orginalcordinates[1].y:=-33;
- obj.orginalcordinates[1].z:=2;
-
- obj.orginalcordinates[2].x:=-33;
- obj.orginalcordinates[2].y:=33;
- obj.orginalcordinates[2].z:=33;
-
- obj.orginalcordinates[3].x:=33;
- obj.orginalcordinates[3].y:=33;
- obj.orginalcordinates[3].z:=33;
-
- obj.orginalcordinates[4].x:=2;
- obj.orginalcordinates[4].y:=-33;
- obj.orginalcordinates[4].z:=2;
-
- obj.orginalcordinates[5].x:=-2;
- obj.orginalcordinates[5].y:=-33;
- obj.orginalcordinates[5].z:=-2;
-
- obj.orginalcordinates[6].x:=-33;
- obj.orginalcordinates[6].y:=33;
- obj.orginalcordinates[6].z:=-33;
-
- obj.orginalcordinates[7].x:=33;
- obj.orginalcordinates[7].y:=33;
- obj.orginalcordinates[7].z:=-33;
-
- obj.orginalcordinates[8].x:=2;
- obj.orginalcordinates[8].y:=-33;
- obj.orginalcordinates[8].z:=-2;
-
- END;
-
- Procedure rektangle1;
-
- BEGIN
- obj.numberofpoints:=8;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
-
-
- obj.orginalcordinates[1].x:=-5;
- obj.orginalcordinates[1].y:=-5;
- obj.orginalcordinates[1].z:=30;
-
- obj.orginalcordinates[2].x:=-5;
- obj.orginalcordinates[2].y:=5;
- obj.orginalcordinates[2].z:=30;
-
- obj.orginalcordinates[3].x:=5;
- obj.orginalcordinates[3].y:=5;
- obj.orginalcordinates[3].z:=30;
-
- obj.orginalcordinates[4].x:=5;
- obj.orginalcordinates[4].y:=-5;
- obj.orginalcordinates[4].z:=30;
-
- obj.orginalcordinates[5].x:=-5;
- obj.orginalcordinates[5].y:=-5;
- obj.orginalcordinates[5].z:=-30;
-
- obj.orginalcordinates[6].x:=-5;
- obj.orginalcordinates[6].y:=5;
- obj.orginalcordinates[6].z:=-30;
-
- obj.orginalcordinates[7].x:=5;
- obj.orginalcordinates[7].y:=5;
- obj.orginalcordinates[7].z:=-30;
-
- obj.orginalcordinates[8].x:=5;
- obj.orginalcordinates[8].y:=-5;
- obj.orginalcordinates[8].z:=-30;
-
-
- END;
-
- Procedure rektangle2;
-
- BEGIN
- obj.numberofpoints:=8;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
-
-
- obj.orginalcordinates[1].x:=-30;
- obj.orginalcordinates[1].y:=-5;
- obj.orginalcordinates[1].z:=30;
-
- obj.orginalcordinates[2].x:=-30;
- obj.orginalcordinates[2].y:=5;
- obj.orginalcordinates[2].z:=30;
-
- obj.orginalcordinates[3].x:=30;
- obj.orginalcordinates[3].y:=5;
- obj.orginalcordinates[3].z:=30;
-
- obj.orginalcordinates[4].x:=30;
- obj.orginalcordinates[4].y:=-5;
- obj.orginalcordinates[4].z:=30;
-
- obj.orginalcordinates[5].x:=-30;
- obj.orginalcordinates[5].y:=-5;
- obj.orginalcordinates[5].z:=-30;
-
- obj.orginalcordinates[6].x:=-30;
- obj.orginalcordinates[6].y:=5;
- obj.orginalcordinates[6].z:=-30;
-
- obj.orginalcordinates[7].x:=30;
- obj.orginalcordinates[7].y:=5;
- obj.orginalcordinates[7].z:=-30;
-
- obj.orginalcordinates[8].x:=30;
- obj.orginalcordinates[8].y:=-5;
- obj.orginalcordinates[8].z:=-30;
- end;
-
- procedure cube;
-
- begin
- obj.numberofpoints:=8;
- obj.degre.x:=0;
- obj.degre.y:=0;
- obj.degre.z:=0;
- obj.degreinc.x:=1;
- obj.degreinc.y:=1;
- obj.degreinc.z:=1;
-
- obj.orginalcordinates[1].x:=-20;
- obj.orginalcordinates[1].y:=-20;
- obj.orginalcordinates[1].z:=20;
-
- obj.orginalcordinates[2].x:=-20;
- obj.orginalcordinates[2].y:=20;
- obj.orginalcordinates[2].z:=20;
-
- obj.orginalcordinates[3].x:=20;
- obj.orginalcordinates[3].y:=20;
- obj.orginalcordinates[3].z:=20;
-
- obj.orginalcordinates[4].x:=20;
- obj.orginalcordinates[4].y:=-20;
- obj.orginalcordinates[4].z:=20;
-
- obj.orginalcordinates[5].x:=-20;
- obj.orginalcordinates[5].y:=-20;
- obj.orginalcordinates[5].z:=-20;
-
- obj.orginalcordinates[6].x:=-20;
- obj.orginalcordinates[6].y:=20;
- obj.orginalcordinates[6].z:=-20;
-
- obj.orginalcordinates[7].x:=20;
- obj.orginalcordinates[7].y:=20;
- obj.orginalcordinates[7].z:=-20;
-
- obj.orginalcordinates[8].x:=20;
- obj.orginalcordinates[8].y:=-20;
- obj.orginalcordinates[8].z:=-20;
- end;
-
- Procedure XROUT;
-
- Var i: INTEGER;
-
- Begin
- for i:= 1 to obj.numberofpoints do begin
- { round off because floting point calulation sucks, and you relly
- doesn't lose very mush in accuracy}
- obj.rotatedcordinates[i].x := round(obj.objpos.x+obj.orginalcordinates[i].x);
- obj.rotatedcordinates[i].y := round(obj.objpos.y+obj.orginalcordinates[i].y*cosa[obj.degre.x]-obj.orginalcordinates[i].z*
- sina[obj.degre.x]);
- obj.rotatedcordinates[i].z := round(obj.objpos.z+obj.orginalcordinates[i].y*sina[obj.degre.x]+obj.orginalcordinates[i].z*
- cosa[obj.degre.x]);
- End;
- End;
-
- Procedure YROUT;
-
- Var i: INTEGER;
-
- Begin
- for i:= 1 to obj.numberofpoints do begin
- obj.rotatedcordinates[i].x := round(obj.objpos.x+obj.orginalcordinates[i].x*cosa[obj.degre.y]+obj.orginalcordinates[i].z
- *sina[obj.degre.y]);
- obj.rotatedcordinates[i].y := round(obj.objpos.y+obj.orginalcordinates[i].y);
- obj.rotatedcordinates[i].z := round(obj.objpos.z-obj.orginalcordinates[i].x*sina[obj.degre.y]+obj.orginalcordinates[i].z
- *cosa[obj.degre.y]);
- End;
- End;
-
- Procedure ZROUT;
-
- Var i : INTEGER;
-
- Begin
- for i:= 1 to obj.numberofpoints do begin
- obj.rotatedcordinates[i].x :=round( obj.objpos.x+obj.orginalcordinates[i].x*cosa[obj.degre.z]-obj.orginalcordinates[i].y
- *sina[obj.degre.z]);
- obj.rotatedcordinates[i].y :=round( obj.objpos.y+obj.orginalcordinates[i].x*sina[obj.degre.z]+obj.orginalcordinates[i].y
- *cosa[obj.degre.z]);
- obj.rotatedcordinates[i].z :=round( obj.objpos.z+obj.orginalcordinates[i].z);
- end;
- end;
-
- Procedure ZXYROUT;
-
- Var a,b,c,d,e,f,g,h,j : REAL;
- i : INTEGER;
-
-
- Begin
- a:=cosa[obj.degre.y]*cosa[obj.degre.z];
- b:=cosa[obj.degre.y]*sina[obj.degre.z];
- c:=-sina[obj.degre.y];
- d:=sina[obj.degre.x]*sina[obj.degre.y]*cosa[obj.degre.z]-cosa[obj.degre.x]*sina[obj.degre.z];
- e:=sina[obj.degre.x]*sina[obj.degre.y]*sina[obj.degre.z]+cosa[obj.degre.x]*cosa[obj.degre.z];
- f:=sina[obj.degre.x]*cosa[obj.degre.y];
- g:=cosa[obj.degre.x]*sina[obj.degre.y]*cosa[obj.degre.z]+sina[obj.degre.x]*sina[obj.degre.z];
- h:=cosa[obj.degre.x]*sina[obj.degre.y]*sina[obj.degre.z]-sina[obj.degre.x]*cosa[obj.degre.z];
- j:=cosa[obj.degre.x]*cosa[obj.degre.y];
- for i:= 1 to obj.numberofpoints do begin
- obj.rotatedcordinates[i].x :=round( obj.objpos.x+obj.orginalcordinates[i].x*a+obj.orginalcordinates[i].y*b
- +obj.orginalcordinates[i].z*c);
- obj.rotatedcordinates[i].y :=round( obj.objpos.y+obj.orginalcordinates[i].x*d+obj.orginalcordinates[i].y*e
- +obj.orginalcordinates[i].z*f);
- obj.rotatedcordinates[i].z :=round( obj.objpos.z+obj.orginalcordinates[i].x*g+obj.orginalcordinates[i].y*h
- +obj.orginalcordinates[i].z*j);
- end;
- end;
-
- procedure uppgradeobject;
-
- begin
- inc(obj.degre.x,obj.degreinc.x);
- inc(obj.degre.y,obj.degreinc.y);
- inc(obj.degre.z,obj.degreinc.z);
- if obj.degre.x<0 then inc(obj.degre.x,360);
- if obj.degre.x>360 then dec(obj.degre.x,360);
- if obj.degre.y<0 then inc(obj.degre.y,360);
- if obj.degre.y>360 then dec(obj.degre.y,360);
- if obj.degre.z<0 then inc(obj.degre.z,360);
- if obj.degre.z>360 then dec(obj.degre.z,360);
- end;
-
- Procedure rotateobjects;
-
- begin
- zxyrout;
- end;
-
- procedure perspective;
-
- var i : INTEGER;
-
- begin
- for i:= 1 to obj.numberofpoints do begin
- obj.screencordinates[i].x:=320+round(longint(obj.rotatedcordinates[i].x)*500/obj.rotatedcordinates[i].z);
- obj.screencordinates[i].y:=175+round(longint(obj.rotatedcordinates[i].y)*500/obj.rotatedcordinates[i].z);
- end;
- end;
-
- procedure putdots;
-
- var i : INTEGER;
-
- begin
- setvisualpage(page);
- page:=page xor 3;
- setactivepage(page);
- clearviewport;
- for i:=1 to obj.numberofpoints do begin
- putpixel(obj.screencordinates[i].x,obj.screencordinates[i].y,15);
- end;
- end;
-
- procedure init;
-
- var gd,gm : INTEGER;
- i : INTEGER;
-
- begin
- gd:=vga;
- gm:=vgamed; { graphics mode 640*350 pixels }
- initgraph(gd,gm,'c:\bp\bgi'{your bgi directory});
- for i:=0 to 360 do begin
- sina[i]:=sin(i*pi/180{*/180 converts it to radians which the computer
- calculed in don't think more about this});
- cosa[i]:=cos(i*pi/180);
- end;
- page:=2;
- obj.objpos.x:=0;
- obj.objpos.y:=0;
- obj.objpos.z:=150;
- object3;
- end;
-
-
- procedure Close;
-
- begin
- closegraph;
- end;
-
- begin
- init;
- repeat
- uppgradeobject;
- rotateobjects;
- perspective;
- putdots;
- until keypressed;
- close;
- end.